home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
EnigmA Amiga Run 1996 March
/
EnigmA AMIGA RUN 05 (1996)(G.R. Edizioni)(IT)[!][issue 1996-03][Skylink CD IV].iso
/
docs
/
corsoguide
/
interrupt-11.txt
< prev
next >
Wrap
Text File
|
1996-02-22
|
3KB
|
65 lines
Interrupt
L'interrupt (in italiano interruzione) è un segnale che viene inviato
dall'hardware (quasi sempre adibito a mansioni di I/O) al microprocessore
che interrompe per questo il normale corso di elaborazione del programma per
andare ad eseguire una particolare routine (detta interrupt server o
servitore dell'interruzione) che risolverà la particolare situazione del
sistema; ad esempio un classico caso di interrupt è la tastiera: appena
l'utente preme un tasto, l'interfaccia della tastiera invia un interrupt al
microprocessore, il quale esegue la routine di interruzione che preleva il
codice del tasto premuto; in questa maniera si evita che il microprocessore
verfichi sempre se un tasto è premuto (polling) risparmiando così, un
notevole numero di cicli macchina; potete osservare la lista delle diverse
interruzioni nella tabella apposita.
Accanto a questo tipo di interrupt denominati hardware vi sono i software
interrupts, cioè interrupt provocati dal software (dal task quindi); voi
direte: a questo punto conviene creare un subroutine da chiamare quando
serve e si ottiene lo stesso risultato! Invece non è proprio la stessa cosa,
poiché le interrupt software hanno una priorità più alta dei task (e più
bassa delle interrupt hardware) quindi eseguendo un interrupt software il
multitasking è momentaneamente disattivato.
La struttura che definisce un'interrupt sia software che hardware è la
seguente:
struct Interrupt
{
struct Node is_Node;
APTR id_Data;
VOID (*is_Code)();
};
dove is_Node indica che l'interrupt è mantenuta in una lista del s.o. e
devono essere definite le sue caratteristiche, priorità, nome e tipo
(NT_INTERRUPT); is_Data è un puntatore ad un buffer dati gestito dal
programmatore per passare all'interrupt, dati che possono essere utili;
is_Code è il puntatore alla routine di interrupt.
Le funzioni di exec che servono per l'installazione di interrupt sono:
vecchiaint = (struct Interrupt *)SetIntVector(tipoint,nuovaint);
dove "tipoint" è una costante definita in <hardware/intbits.h> che indica a
quale interrupt hardware installare il server identificato dal puntatore
alla struttura Interrupt "nuovaint"; "vecchiaint" è il puntatore alla
struttura Interrupt del server che viene rimpiazzato; questa funzione
esclude il codice di interrupt esistente, e questo potrebbe causare qualche
problema al sistema a cui potrebbe servire l'interrupt, quindi va usata con
cautela.
AddIntServer(tipoint,nuovaint);
Questa funzione invece aggiunge l'interrupt a quelle già esistenti;
praticamente quando si verifica l'interrupt di tipo "tipoint" il sistema
scandirà una lista (ordinata per priorità) con i diversi interrupt servers e
li eseguirà tutti; questo metodo quindi non mette in pericolo il perfetto
funzionamento del sistema; per eliminare l'interrupt dalla lista dei servers
occorre chiamare RemIntServer con gli stessi parametri della AddIntServer.
La funzione per chiamare un'interrupt software è questa:
Cause(inter);
dove "inter" è il puntatore ad una struttura Interrupt. In realtà come
abbiamo visto la puntata scorsa l'interrupt software può essere chiamata da
una porta appena giunge un messaggio ponendo in mp_Flags PA_SOFTINT e in
mp_SigTask il puntatore alla struttura Interrupt relativa.